www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/savegame.cpp

    //Download by http://www.NewXing.com
#include <ddraw.h>
#include "main.h"
#include "SaveGame.h"
#include "newgame.h"
#include "gamelib\\dialog\\dialog.h"

void CALLBACK SaveGameTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
void SaveGameRefreshScreen();
void JudgeMousePlace_save( );
void DrawGameInfo(int i);
void ShowGameInfo(int i);
void SaveGameInfo(int i);

RLEBITHEADER * SaveGameRLE;
RLEBITHEADER * selete_SaveRLE;
RLEBITHEADER * unselete_SaveRLE;
RLEBITHEADER * scrollRLE;
GameSave	 * gameOldSaved[4];
BMPHEADER	 * gameImage[4];



int iScroll;
int id_game;
int iCurrentStartN;	//当前开始的存档号


bool SaveGameSelect = false;
int SaveGameSelectNum = 0;

int SaveGame_func()
{
	MSG msg;
	SaveGameSelect = false;
	SaveGameRLE = LoadRleImage("pic\\dialog\\dialog.ret");
	selete_SaveRLE = LoadRleImage("pic\\dialog\\select_save.ret");
	unselete_SaveRLE = LoadRleImage("pic\\dialog\\unselect_save.ret");
	scrollRLE = LoadRleImage("pic\\dialog\\scroll.ret");
	
	int i;

	iScroll= 0;
	iCurrentStartN = 0;

	for(i = 0; i < 4; i++)
	{
		gameOldSaved[i] = NULL;
		DrawGameInfo(i);
	}

	long lW, lH;
	//显示对话框
	lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
	lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;
	ShowRleImage_NR(lW, lH, 0, 0, SaveGameRLE, pS[SBuffer], SP[SBuffer]);	
	//显示档案记录
	ShowRleImage_NR(lW+26, lH+26, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	ShowRleImage_NR(lW+26, lH+139, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	ShowRleImage_NR(lW+26, lH+252, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	ShowRleImage_NR(lW+26, lH+365, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	//存储当前图形
	rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	FastBlt(0, 0, rect1, pS[SBack], pS[SBuffer], SP[SBack], SP[SBuffer], false, 0);

	cursor = 0;
	PA_SAFE_DELETE(mouseRLE);
	mouseRLE = LoadRleImage("Pic\\cursor\\cursor01.ret");
	cursorT = 4;
	SetTimer(hwnd, 1, 50, SaveGameTimer);
	while(!SaveGameSelect)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if ( msg.message==WM_QUIT)
				break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else 
		{	
			SaveGameRefreshScreen( );
		}			
	}
	KillTimer(hwnd, 1);
	PA_SAFE_DELETE(SaveGameRLE);
	PA_SAFE_DELETE(selete_SaveRLE);
	PA_SAFE_DELETE(unselete_SaveRLE);
	PA_SAFE_DELETE(scrollRLE);
	for(i = 0; i < 4; i++)
	{
		P_SAFE_DELETE(gameOldSaved[i]);
		PA_SAFE_DELETE(gameImage[i]);
	}
	return SaveGameSelectNum;
}

LRESULT WINAPI SaveGameMessageProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_SETCURSOR:
		SetCursor(NULL);
		break;
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:
			SaveGameSelectNum = 0;
			SaveGameSelect = true;
			break;
		default:
			return 1;
		}
		break;
	case WM_LBUTTONDOWN:
		curpos.x = LOWORD (lParam);
		curpos.y = HIWORD (lParam);
		JudgeMousePlace_save( );
		switch(id_game)
		{
		case 0x01:
		case 0x02:
		case 0x03:
		case 0x04:
			SaveGameInfo(id_game-1);
			break;
		case 0x101:
			if(iScroll >0)
			{
				iScroll --;
			}
			break;
		case 0x102:
			if(iScroll < 16)
			{
				iScroll ++;
			}
			break;
		}
		break;
	case WM_MOUSEMOVE:
		curpos.x = LOWORD (lParam);
		curpos.y = HIWORD (lParam);
		if(curpos.x > SCREEN_WIDTH - 1 )
		{
			curpos.x = SCREEN_WIDTH-1;
			SetCursorPos(curpos.x, curpos.y);
		}
		if(curpos.y > SCREEN_HEIGHT - 1)
		{
			curpos.y = SCREEN_HEIGHT-1;
			SetCursorPos(curpos.x, curpos.y);
		}
		JudgeMousePlace_save( );
		break;
    default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 1;
}

void SaveGameRefreshScreen()
{
	long lW, lH;
	lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
	lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;

	rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	FastBlt(0, 0, rect1, pS[SBuffer], pS[SBack], SP[SBuffer], SP[SBack], false, 0);
	
	switch(id_game)
	{
	case 0x01:	//当鼠标当前第一个存档时
		ShowRleImage_NR(lW+26, lH+26, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	case 0x02:  //当鼠标当前第二个存档时
		ShowRleImage_NR(lW+26, lH+139, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	case 0x03:  //当鼠标当前第三个存档时
		ShowRleImage_NR(lW+26, lH+252, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	case 0x04:  //当鼠标当前第四个存档时
		ShowRleImage_NR(lW+26, lH+365, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	}
	//显示存档信息
	int i;
		if(iCurrentStartN != iScroll)
		{
			if(iCurrentStartN > iScroll)
			{
				switch(iCurrentStartN - iScroll)
				{
				case 1:
					PA_SAFE_DELETE(gameOldSaved[3]);
					P_SAFE_DELETE(gameImage[3]);
	
					gameOldSaved[3] = gameOldSaved[2];
					gameImage[3]	= gameImage[2];
					gameOldSaved[2] = gameOldSaved[1];
					gameImage[2]	= gameImage[1];
					gameOldSaved[1] = gameOldSaved[0];
					gameImage[1]	= gameImage[0];

					gameOldSaved[0] = NULL;
					gameImage[0]	= NULL;
	
					DrawGameInfo(0);
					break;
				case 2:
					P_SAFE_DELETE(gameOldSaved[3]);
					PA_SAFE_DELETE(gameImage[3]);
					P_SAFE_DELETE(gameOldSaved[2]);
					PA_SAFE_DELETE(gameImage[2]);
	
					gameOldSaved[3] = gameOldSaved[1];
					gameImage[3]	= gameImage[1];
					gameOldSaved[2] = gameOldSaved[0];
					gameImage[2]	= gameImage[0];
	
					gameOldSaved[1] = NULL;
					gameImage[1]	= NULL;
					gameOldSaved[0] = NULL;
					gameImage[0]	= NULL;
	
					DrawGameInfo(0);
					DrawGameInfo(1);
					break;
				case 3:
					P_SAFE_DELETE(gameOldSaved[3]);
					PA_SAFE_DELETE(gameImage[3]);
					P_SAFE_DELETE(gameOldSaved[2]);
					PA_SAFE_DELETE(gameImage[2]);
					P_SAFE_DELETE(gameOldSaved[1]);
					PA_SAFE_DELETE(gameImage[1]);
	
					gameOldSaved[3] = gameOldSaved[0];
					gameImage[3]	= gameImage[0];
	
					gameOldSaved[0] = NULL;
					gameImage[0]	= NULL;
					gameOldSaved[1] = NULL;
					gameImage[1]	= NULL;
					gameOldSaved[2] = NULL;
					gameImage[2]	= NULL;
	
					DrawGameInfo(0);
					DrawGameInfo(1);
					DrawGameInfo(2);
					break;
				default:
					for(i = 0; i < 4; i++)
					{
						DrawGameInfo(i);
					}
					break;
				}
			}
			else
			{
				switch(iScroll - iCurrentStartN)
				{
				case 1:
					P_SAFE_DELETE(gameOldSaved[0]);
					PA_SAFE_DELETE(gameImage[0]);
	
					gameOldSaved[0] = gameOldSaved[1];
					gameImage[0]	= gameImage[1];
					gameOldSaved[1] = gameOldSaved[2];
					gameImage[1]	= gameImage[2];
					gameOldSaved[2] = gameOldSaved[3];
					gameImage[2]	= gameImage[3];
	
					gameOldSaved[3] = NULL;
					gameImage[3]	= NULL;
	
					DrawGameInfo(3);
					break;
				case 2:
					P_SAFE_DELETE(gameOldSaved[0]);
					PA_SAFE_DELETE(gameImage[0]);
					P_SAFE_DELETE(gameOldSaved[1]);
					PA_SAFE_DELETE(gameImage[1]);
	
					gameOldSaved[0] = gameOldSaved[2];
					gameImage[0]	= gameImage[2];
					gameOldSaved[1] = gameOldSaved[3];
					gameImage[1]	= gameImage[3];
	
					gameOldSaved[2] = NULL;
					gameImage[2]	= NULL;
					gameOldSaved[3] = NULL;
					gameImage[3]	= NULL;
	
					DrawGameInfo(2);
					DrawGameInfo(3);
					break;
				case 3:
					P_SAFE_DELETE(gameOldSaved[0]);
					PA_SAFE_DELETE(gameImage[0]);
					P_SAFE_DELETE(gameOldSaved[1]);
					PA_SAFE_DELETE(gameImage[1]);
					P_SAFE_DELETE(gameOldSaved[2]);
					PA_SAFE_DELETE(gameImage[2]);
	
					gameOldSaved[0] = gameOldSaved[3];
					gameImage[0]	= gameImage[3];
	
					gameOldSaved[1] = NULL;
					gameImage[1]	= NULL;
					gameOldSaved[2] = NULL;
					gameImage[2]	= NULL;
					gameOldSaved[3] = NULL;
					gameImage[3]	= NULL;
	
					DrawGameInfo(1);
					DrawGameInfo(2);
					DrawGameInfo(3);
					break;
				default:
					for(i = 0; i < 4; i++)
					{
						DrawGameInfo(i);
					}
					break;
				}
			}
			iCurrentStartN = iScroll;
		}
	for(i = 0; i < 4; i++)
	{
		ShowGameInfo(i);
	}
	
	//显示滚动箭头
	if(iScroll != 0)
	{
		if(id_game != 0x101)
			ShowRleImage_NR(lW+555, lH+180, 0, 0, scrollRLE, pS[SBuffer], SP[SBuffer]);
		else
			ShowRleImage_NR(lW+555, lH+180, 1, 0, scrollRLE, pS[SBuffer], SP[SBuffer]);
	}
	if(iScroll != 16)
	{
		if(id_game != 0x102)
			ShowRleImage_NR(lW+555, lH+259, 0, 1, scrollRLE, pS[SBuffer], SP[SBuffer]);
		else
			ShowRleImage_NR(lW+555, lH+259, 1, 1, scrollRLE, pS[SBuffer], SP[SBuffer]);
	}

	//显示鼠标
	
	lW = mouseRLE->bfWidth/mouseRLE->bfWidthBitN;
	lH = mouseRLE->bfHeight/mouseRLE->bfHeightBitN;

	RECT rect3;
	rect3.left = 0;
	rect3.top  = 0;
	rect3.right = curpos.x+lW > SCREEN_WIDTH?SCREEN_WIDTH-curpos.x:lW;
	rect3.bottom = curpos.y+lH > SCREEN_HEIGHT?SCREEN_HEIGHT-curpos.y:lH;
	ShowRleImage(curpos.x, curpos.y, cursor, 0, rect3, mouseRLE, pS[SBuffer], SP[SBuffer]);
	UpdateScreen();
}

void CALLBACK SaveGameTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
}

void JudgeMousePlace_save( )
{
	long lW, lH;
	id_game = 0;
	lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
	lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;
	if((curpos.x > lW+26)&&(curpos.x < lW+530))
	{
		if((curpos.y > lH+26)&&(curpos.y < lH+134))
			id_game |= 0x01;
		else if((curpos.y > lH+139)&&(curpos.y < lH+247))
			id_game |= 0x02;
		else if((curpos.y > lH+252)&&(curpos.y < lH+360))
			id_game |= 0x03;
		else if((curpos.y > lH+365)&&(curpos.y < lH+473))
			id_game |= 0x04;
	}
	if((curpos.x > lW+555)&&(curpos.x < lW+573))
	{
		if((curpos.y > lH+180)&&(curpos.y < lH+197))
			id_game |= 0x101;
		else if((curpos.y > lH+259)&&(curpos.y < lH+276))
			id_game |= 0x102;
	}
}

void DrawGameInfo(int i)
{
	int iN = i+iScroll;
	char	filename[10];
	char	pstrFileName[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,pstrFileName);
	strcat(pstrFileName,  "\\save\\");
	itoa(iN, filename, 10);
	strcat(pstrFileName, filename);
	strcat(pstrFileName, ".info");

	FILE *file=fopen(pstrFileName,"rb");

	if(!file)
	{
		return;
	}

	if(gameOldSaved[i])
	{
		P_SAFE_DELETE(gameOldSaved[i]);
		PA_SAFE_DELETE(gameImage[i]);
	}
	gameOldSaved[i] = new GameSave;
	gameOldSaved[i]->GameRole = new ROLE;
	gameImage[i] = (BMPHEADER	 * )new WORD[SW[SGameImage]*SH[SGameImage]+sizeof(BMPHEADER)/sizeof(WORD)];

	fread(&gameOldSaved[i]->GameHeader, sizeof(GameSaveHeader), 1, file);
	fread(gameImage[i], SW[SGameImage]*SH[SGameImage]*sizeof(WORD)+sizeof(BMPHEADER), 1, file);
	fread(gameOldSaved[i]->GameRole , sizeof(ROLE), 1, file);
	fclose(file);	
}

void ShowGameInfo(int i)
{
	long lW, lH;
	HDC	 hdc;
	CFont cFont;
	char info[255];
	char info1[10];

	lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
	lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;
	DDS[SBuffer]->GetDC(&hdc);
	cFont.UseFont(hdc,DCF_USERDEFINE, 16, 800);

	wsprintf(info,"%3d",i+iScroll);
	ShowText(hdc, lW+35, lH+35+(i<<7)+i-(i<<4), RGB(255,0,0), info);
	if(gameOldSaved[i] == NULL)
	{
		cFont.RestoreFont(hdc);
		DDS[SBuffer]->ReleaseDC(hdc);
		return;
	}
	cFont.RestoreFont(hdc);
	cFont.UseFont(hdc,DCF_USERDEFINE, 12);
	wsprintf(info,"%4d年%2d月%2d日%2d时%2d分%2d秒",gameOldSaved[i]->GameHeader.time.wYear, gameOldSaved[i]->GameHeader.time.wMonth, gameOldSaved[i]->GameHeader.time.wDay,
		gameOldSaved[i]->GameHeader.time.wHour, gameOldSaved[i]->GameHeader.time.wMinute, gameOldSaved[i]->GameHeader.time.wSecond);
	ShowText(hdc, lW+350, lH+38+(i<<7)+i-(i<<4), RGB(255,255,255), info);
	
		strcpy(info, "等级: ");
		wsprintf(info1,"%4d",gameOldSaved[i]->GameRole->level);
		strcat(info, info1);
		ShowText(hdc, lW+180, lH+38+(i<<7)+i-(i<<4), RGB(0,255,255), info);
	
		strcpy(info, "生命:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->health);
		strcat(info, info1);
		strcat(info, " / ");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->MaxHealth);
		strcat(info, info1);
		strcat(info, "    内力:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->energy);
		strcat(info, info1);
		strcat(info, " / ");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->MaxEnergy);
		strcat(info, info1);
		strcat(info, "    精力:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->vigor);
		strcat(info, info1);
		strcat(info, " / ");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->MaxVigor);
		strcat(info, info1);
		ShowText(hdc, lW+180, lH+56+(i<<7)+i-(i<<4), RGB(255,0,0), info);


		strcpy(info, "攻击力:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->attack);
		strcat(info, info1);
		strcat(info, "  攻击速度:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->v);
		strcat(info, info1);
		strcat(info, "    防御力:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->defend);
		strcat(info, info1);
		strcat(info, "  行走速度:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->speed);
		strcat(info, info1);
		ShowText(hdc, lW+180, lH+74+(i<<7)+i-(i<<4), RGB(128,0,128), info);

		strcpy(info, "敏  捷:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->agility);
		strcat(info, info1);
		strcat(info, "      实战经验: ");
		wsprintf(info1,"%8ld",gameOldSaved[i]->GameRole->experiment);
		strcat(info, info1);
		ShowText(hdc, lW+180, lH+92+(i<<7)+i-(i<<4), RGB(0,0,255), info);

		strcpy(info, "名  望:");
		wsprintf(info1,"%3d",gameOldSaved[i]->GameRole->reputation);
		strcat(info, info1);
		strcat(info, "      升级经验: ");
		wsprintf(info1,"%8ld",gameOldSaved[i]->GameRole->MaxExperiment);
		strcat(info, info1);
		ShowText(hdc, lW+180, lH+110+(i<<7)+i-(i<<4), RGB(0,196,196), info);

	cFont.RestoreFont(hdc);
	DDS[SBuffer]->ReleaseDC(hdc);
	RECT rect1 = {0, 0, gameImage[i]->bfWidth, gameImage[i]->bfHeight};

	ShowBMPImage(lW+70, lH+40+(i<<7)+i-(i<<4), rect1, gameImage[i], pS[SBuffer], SP[SBuffer], false);
}

void SaveGameInfo(int i)
{
	if(gameOldSaved[i])
	{
		int iReturn;
		KillTimer(hwnd, 1);
		gWPPStack.Push(lpWndProc);
	
		lpWndProc = DialogMessageProc;
		rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

		GraySurface(rect1);
		FastBlt(0, 0, rect1, pS[SBack], pS[SBuffer], SP[SBack], SP[SBuffer], false, 0);
		iReturn = Dialog_func("是否替换当前存档?");
		gWPPStack.Pop(lpWndProc);

		cursor = 0;
		PA_SAFE_DELETE(mouseRLE);
		mouseRLE = LoadRleImage("Pic\\cursor\\cursor01.ret");
		cursorT = 4;

		long lW, lH;
		//显示对话框
		lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
		lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;
		ShowRleImage_NR(lW, lH, 0, 0, SaveGameRLE, pS[SBuffer], SP[SBuffer]);	
		//显示档案记录
		ShowRleImage_NR(lW+26, lH+26, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		ShowRleImage_NR(lW+26, lH+139, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		ShowRleImage_NR(lW+26, lH+252, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		ShowRleImage_NR(lW+26, lH+365, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		//存储当前图形
		rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
		FastBlt(0, 0, rect1, pS[SBack], pS[SBuffer], SP[SBack], SP[SBuffer], false, 0);

		if(iReturn == 2)
		{
			return;
		}
		P_SAFE_DELETE(gameOldSaved[i]);
		PA_SAFE_DELETE(gameImage[i]);
	}
	gameOldSaved[i] = new GameSave;
	gameOldSaved[i]->GameRole = new ROLE;
	gameImage[i] = (BMPHEADER	 * )new WORD[SW[SGameImage]*SH[SGameImage]+sizeof(BMPHEADER)/sizeof(WORD)];
	GetLocalTime(&gameOldSaved[i]->GameHeader.time);
	gameOldSaved[i]->GameHeader.id			= i+iScroll;
	gameOldSaved[i]->GameHeader.nVersion	= VERSION;
	gameOldSaved[i]->GameRole->LoadFromRole(role);
	gameImage[i][0].bfBitCount				= 565;
	gameImage[i][0].bfColorKey				= 0;
	gameImage[i][0].bfHeight				= (WORD)(SH[SGameImage]);
	gameImage[i][0].bfType					= * (WORD *)"CB";
	gameImage[i][0].bfSize					= (SW[SGameImage]*SH[SGameImage])<<1;
	gameImage[i][0].bfWidth					= (WORD)(SW[SGameImage]);

	BOOL   	bSuccess ;
	DWORD  	dwBytesWritten ;
	HANDLE 	hFile ;
	char	filename[10];
	char	pstrFileName[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,pstrFileName);
	strcat(pstrFileName,  "\\save\\");
	itoa(i+iScroll, filename, 10);
	strcat(pstrFileName, filename);
	strcat(pstrFileName, ".info");

	hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;

	if (hFile == INVALID_HANDLE_VALUE)
       	return;
    bSuccess = WriteFile (hFile, &gameOldSaved[i]->GameHeader, sizeof(GameSaveHeader), &dwBytesWritten, NULL) ;

    if (!bSuccess || (dwBytesWritten != sizeof(GameSaveHeader)))
    {
        DeleteFile (pstrFileName) ;
        return;
    }
 
	RECT drect;
	drect = MakeRect(0, 0, SW[SGameImage], SH[SGameImage]);
	FastBlt(0, 0, drect, (DWORD *)&gameImage[i][1], pS[SGameImage], SP[SGameImage], SP[SGameImage], false, 0);
	bSuccess = WriteFile (hFile, gameImage[i], SW[SGameImage]*SH[SGameImage]*sizeof(WORD)+sizeof(BMPHEADER), &dwBytesWritten, NULL) ;

    if (!bSuccess || (dwBytesWritten != SW[SGameImage]*SH[SGameImage]*sizeof(WORD)+sizeof(BMPHEADER)))
    {
          		DeleteFile (pstrFileName) ;
          		return;
    }

	WriteFile (hFile, gameOldSaved[i]->GameRole, sizeof(ROLE), &dwBytesWritten, NULL) ;

	CloseHandle (hFile) ;

	GetCurrentDirectory(MAX_PATH,pstrFileName);
	strcat(pstrFileName,  "\\save\\");
	itoa(i+iScroll, filename, 10);
	strcat(pstrFileName, filename);
	strcat(pstrFileName, ".save");

	hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL,
    CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;

	if (hFile == INVALID_HANDLE_VALUE)
       	return;

	WriteFile (hFile, &MainScript, sizeof(CScript), &dwBytesWritten, NULL) ;
	for(i = 0; i < 10; i++)
	{
		bSuccess = WriteFile (hFile, &Script_Child[i], sizeof(CScript), &dwBytesWritten, NULL) ;
		if (!bSuccess || (dwBytesWritten != sizeof(CScript)))
		{
			DeleteFile (pstrFileName);
		  return;
		}
	}
	WriteFile (hFile, Map->cMapName, MAX_PATH*sizeof(char), &dwBytesWritten, NULL) ;
	for(i = 0; i < 9; i++)
	{
		WriteFile (hFile, Map_Child[i].cMapName, MAX_PATH*sizeof(char), &dwBytesWritten, NULL) ;
	}
	int  * iLink = new int[Zoetic->ZoeticHeader.nMagicN];
	_ZoeticLink *  ZoeticLink =  Zoetic->ZoeticLinkHeader;
	for(i = 0; i < (int)Zoetic->ZoeticHeader.nMagicN; i++)
	{
		if(ZoeticLink == NULL)
		{
			iLink[i] = 0xffff;
			break;
		}
		iLink[i] = ZoeticLink->dI;
		ZoeticLink = ZoeticLink->Next;
	}
	bSuccess = WriteFile (hFile, &Zoetic->ZoeticHeader, sizeof(_ZoeticHeader), &dwBytesWritten, NULL) ;
	bSuccess = WriteFile (hFile, Zoetic->MainStatus, Zoetic->ZoeticHeader.nMagicN*sizeof(int), &dwBytesWritten, NULL) ;
	bSuccess = WriteFile (hFile, iLink, Zoetic->ZoeticHeader.nMagicN*sizeof(int), &dwBytesWritten, NULL) ;
	
	for(i = 0; i < (int)Zoetic->ZoeticHeader.nMagicN; i++)
	{
		bSuccess = WriteFile (hFile, &(Zoetic->ZoeticLink[i]), sizeof(_ZoeticLink), &dwBytesWritten, NULL) ;

		if (!bSuccess || (dwBytesWritten != sizeof(_ZoeticLink)))
		{
	        DeleteFile (pstrFileName) ;
	        return;
	    }
	}

	P_SAFE_DELETE(iLink);

	CloseHandle (hFile) ;
    return ;
}